package org.example.erat.parser;

import org.example.erat.exception.UnsupportedFileTypeException;
import org.example.erat.log.core.LoggerSingleton;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.util.HashMap;
import java.util.Map;

/**
 * 文件解析器工厂
 * 用于创建不同类型的文件解析器（Excel/CSV）
 * 实现工厂模式
 */
@Component
public class FileParserFactory {

    private static final Map<String, FileParser> parsers = new HashMap<>();

    /**
     * 初始化解析器
     */
    @PostConstruct
    public void init() {
        // 注册解析器
        registerParser(new ExcelFileParser());
        registerParser(new CsvFileParser());
        registerParser(new WordFileParser());

        // 注册额外的格式支持
        registerParser("xls", new ExcelFileParser());
        registerParser("doc", new WordFileParser());

        LoggerSingleton.getInstance().info("文件解析器工厂初始化完成，支持的文件类型: {}",
                String.join(", ", parsers.keySet()));
    }

    /**
     * 注册解析器
     * @param parser 解析器
     */
    public static void registerParser(FileParser parser) {
        parsers.put(parser.getSupportedFileType(), parser);
    }

    /**
     * 注册解析器（指定文件类型）
     * @param fileType 文件类型
     * @param parser 解析器
     */
    public static void registerParser(String fileType, FileParser parser) {
        parsers.put(fileType.toLowerCase(), parser);
    }

    /**
     * 获取解析器
     * @param fileType 文件类型
     * @return 解析器
     */
    public static FileParser getParser(String fileType) {
        if (fileType == null) {
            LoggerSingleton.getInstance().error("文件类型不能为空");
            throw new UnsupportedFileTypeException("文件类型不能为空");
        }

        FileParser parser = parsers.get(fileType.toLowerCase());
        if (parser == null) {
            LoggerSingleton.getInstance().error("不支持的文件类型: {}，仅支持Excel、Word和CSV格式", fileType);
            throw new UnsupportedFileTypeException("不支持的文件类型: " + fileType + "，仅支持Excel、Word和CSV格式");
        }

        LoggerSingleton.getInstance().debug("获取文件解析器: {}", fileType);
        return parser;
    }

    /**
     * 获取所有支持的文件类型
     * @return 支持的文件类型列表
     */
    public static String[] getSupportedFileTypes() {
        return parsers.keySet().toArray(new String[0]);
    }
}
